//! Konfiguracijska datoteka za 'arh' sloj

#ifndef _ARH_POSTAVKE_H_
#define _ARH_POSTAVKE_H_

#define VELICINA_STOGA_JEZGRE	4096 //0x8000

/* da bi 'grub' 'znao' radit sa 'nasim' sustavom moramo stavit neke
   brojke koje on trazi	
 */
//! Multiboot specifikacija
/* magicni broj */
#define MULTIBOOT_HEADER_MAGIC          0x1BADB002
/* zastavice */
# define MULTIBOOT_HEADER_FLAGS         0x00010003


/* kad se povezivaju funcije asembler <--> C zna bit problema u
   imenovanju funkcija (labela), ovisno o prevodiocu/linkeru
 */
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym)                     _ ## sym
#else
# define EXT_C(sym)                     sym
#endif

#ifdef _ARH_POCETAK_C_

//kasnije ce ovo u gdt.hc ili slicno, sada ignoriraj
#include "tipovi.h"

typedef struct _gdt_t_ {
	uint16	segm_limit0;	//segment limit, bitovi: 15:00		(00-15)
	uint16	base_addr0;	//pocetna adresa, bitovi: 15:00		(16-31)
	uint8	base_addr1;	//pocetna adresa, bitovi: 23:16		(32-38)
	uint8	type	: 4;	//tip segmenta				(39-42)
	uint8	S	: 1;	//tip opisnika: 0-system, 1-kod ili pod.(43-43)
	uint8	DPL	: 2;	//razina prioriteta opisnika		(44-45)
	uint8	P	: 1;	//prisutan (u mem.)			(46-46)
	uint8	segm_limit1: 4;	//segment limit, bitovi: 19:16		(47-50)
	uint8	AVL	: 1;	//"Available for use by system software"(51-51)
	uint8	L	: 1;	//64-bitni segment koda? (inace nebitan)(52-52)
	uint8	DB	: 1;	//1 za 32 bitne sustave, 0 za 16 bitne	(53-53)
	uint8	G	: 1;	//granularnost 0-1B, 1-4kB (za rac.lim.)(54-54)
	uint8	base_addr2;	//pocetna adresa, bitovi: 23:16		(55-63)
	
} __attribute__((__packed__)) gdt_t;

typedef struct _gdtr_t_ {
	uint16 limit;
	gdt_t *gdt;
} __attribute__((__packed__)) gdtr_t;

//prvi zapis u gdt-u je prazan
#define GDT_0	{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

#define GDT_CODE /* svih 4 GB za kod (r-x) */	\
	{	0xffff,	/* segm_limit0	*/	\
		0,	/* base_addr0	*/	\
		0,	/* base_addr1	*/	\
		0x0a,	/* type	r-x	*/	\
		1,	/* S		*/	\
		0,	/* DPL		*/	\
		1,	/* P		*/	\
		0x0f,	/* segm_limit1	*/	\
		0,	/* AVL		*/	\
		0,	/* L		*/	\
		1,	/* DB		*/	\
		1,	/* G		*/	\
		0	/* base_addr2	*/	\
	}

#define GDT_DATA /* svih 4 GB za podatke (rw-)*/\
	{	0xffff,	/* segm_limit0	*/	\
		0,	/* base_addr0	*/	\
		0,	/* base_addr1	*/	\
		0x02,	/* type	rw-	*/	\
		1,	/* S		*/	\
		0,	/* DPL		*/	\
		1,	/* P		*/	\
		0x0f,	/* segm_limit1	*/	\
		0,	/* AVL		*/	\
		0,	/* L		*/	\
		1,	/* DB		*/	\
		1,	/* G		*/	\
		0	/* base_addr2	*/	\
	}

static void gdt_inicijalizacija ();

#endif	/* _ARH_POCETAK_C_ */

#endif	/* _ARH_POSTAVKE_H_ */
